#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
AI小助手服务
提供智能问答、编程指导、学习建议等功能
"""

import json
import logging
import re
import subprocess
import tempfile
import os
from typing import Dict, List, Optional
from datetime import datetime
from .llm_service import LLMService

class AIAssistant:
    """AI小助手服务"""
    
    def __init__(self, llm_service: LLMService = None):
        self.llm_service = llm_service or LLMService(provider='deepseek')
        self.logger = logging.getLogger(__name__)
        
        # 助手角色设定
        self.assistant_role = """你是一个专业的编程教学助手，专门帮助学生学习编程。
你的特点：
1. 耐心细致，善于用通俗易懂的语言解释复杂概念
2. 提供具体的代码示例和解释
3. 鼓励学生思考，而不是直接给出答案
4. 能够识别学生的编程水平，提供适合的建议
5. 在解答问题时，会引导学生理解编程思维
6. 对于错误，会帮助分析原因并给出改进建议
7. 能够提供个性化的学习路径建议
8. 会分析代码中的潜在问题和优化空间

请始终保持友好、鼓励的态度，帮助学生建立编程信心。"""
    
    def chat(self, user_message: str, user_context: Dict = None) -> Dict:
        """智能对话"""
        try:
            # 构建对话上下文
            context = self._build_context(user_context or {})
            
            # 检测消息类型
            message_type = self._detect_message_type(user_message)
            
            # 根据消息类型构建不同的提示词
            if message_type == 'code_question':
                prompt = self._build_code_question_prompt(user_message, context)
            elif message_type == 'concept_question':
                prompt = self._build_concept_prompt(user_message, context)
            elif message_type == 'debug_request':
                prompt = self._build_debug_prompt(user_message, context)
            else:
                prompt = self._build_general_prompt(user_message, context)
            
            messages = [{'role': 'user', 'content': prompt}]
            result = self.llm_service.call_llm(messages)
            
            if result['success']:
                return {
                    'success': True,
                    'response': result['content'],
                    'timestamp': datetime.now().isoformat(),
                    'assistant_type': 'chat',
                    'message_type': message_type
                }
            else:
                return {
                    'success': False,
                    'error': result['error']
                }
                
        except Exception as e:
            self.logger.error(f"AI助手对话失败: {str(e)}")
            return {
                'success': False,
                'error': str(e)
            }
    
    def _detect_message_type(self, message: str) -> str:
        """检测消息类型"""
        message_lower = message.lower()
        
        # 代码相关问题
        if any(keyword in message_lower for keyword in ['代码', '程序', 'function', 'class', 'def', 'if', 'for', 'while', 'error', 'bug']):
            return 'code_question'
        
        # 调试请求
        if any(keyword in message_lower for keyword in ['错误', '报错', 'debug', '调试', '为什么', '怎么解决']):
            return 'debug_request'
        
        # 概念问题
        if any(keyword in message_lower for keyword in ['什么是', '解释', '概念', '原理', '如何理解']):
            return 'concept_question'
        
        return 'general'
    
    def _build_code_question_prompt(self, message: str, context: str) -> str:
        """构建代码问题提示词"""
        return f"""{self.assistant_role}

用户问题：{message}

{context}

这是一个关于代码的问题。请：
1. 提供清晰的代码示例
2. 解释代码的工作原理
3. 说明最佳实践
4. 提供相关的学习资源
5. 鼓励用户动手实践

请用中文回答，并提供可运行的代码示例："""
    
    def _build_concept_prompt(self, message: str, context: str) -> str:
        """构建概念解释提示词"""
        return f"""{self.assistant_role}

用户问题：{message}

{context}

这是一个概念理解问题。请：
1. 用通俗易懂的语言解释概念
2. 提供生活中的类比
3. 给出具体的例子
4. 说明与其他概念的关系
5. 提供学习建议

请用中文回答："""
    
    def _build_debug_prompt(self, message: str, context: str) -> str:
        """构建调试提示词"""
        return f"""{self.assistant_role}

用户问题：{message}

{context}

这是一个调试问题。请：
1. 分析可能的错误原因
2. 提供逐步排查的方法
3. 给出修复建议
4. 解释为什么会出现这个错误
5. 提供预防措施

请用中文回答："""
    
    def _build_general_prompt(self, message: str, context: str) -> str:
        """构建通用提示词"""
        return f"""{self.assistant_role}

用户问题：{message}

{context}

请以AI助手的身份回答用户的问题。回答要：
1. 准确、有用
2. 语言友好、鼓励
3. 适当提供代码示例
4. 引导思考，而不是直接给答案
5. 如果涉及编程，提供清晰的解释

请用中文回答："""
    
    def code_review(self, code: str, language: str = 'python', 
                   user_level: str = 'beginner') -> Dict:
        """代码审查和建议"""
        try:
            prompt = f"""{self.assistant_role}

请对以下{language}代码进行审查和建议：

```{language}
{code}
```

用户水平：{user_level}

请从以下方面进行分析：
1. 代码正确性
2. 代码风格和可读性
3. 性能优化建议
4. 最佳实践建议
5. 学习建议
6. 安全性考虑
7. 可维护性

请用中文回答，保持鼓励和建设性的态度："""
            
            messages = [{'role': 'user', 'content': prompt}]
            result = self.llm_service.call_llm(messages)
            
            if result['success']:
                return {
                    'success': True,
                    'review': result['content'],
                    'timestamp': datetime.now().isoformat(),
                    'assistant_type': 'code_review',
                    'language': language,
                    'user_level': user_level
                }
            else:
                return {
                    'success': False,
                    'error': result['error']
                }
                
        except Exception as e:
            self.logger.error(f"代码审查失败: {str(e)}")
            return {
                'success': False,
                'error': str(e)
            }
    
    def learning_guide(self, topic: str, user_level: str = 'beginner') -> Dict:
        """学习指导"""
        try:
            self.logger.info(f"开始生成学习指导，主题: {topic}, 用户水平: {user_level}")
            
            prompt = f"""{self.assistant_role}

请为以下学习主题制定详细的学习指导：

主题：{topic}
用户水平：{user_level}

请提供：
1. 学习目标
2. 前置知识要求
3. 学习路径（分步骤）
4. 推荐资源
5. 实践项目建议
6. 常见难点和解决方案
7. 学习时间估计
8. 评估方法

请用中文回答，提供具体可行的建议："""
            
            messages = [{'role': 'user', 'content': prompt}]
            self.logger.info("调用LLM服务...")
            result = self.llm_service.call_llm(messages)
            
            if result['success']:
                self.logger.info("学习指导生成成功")
                return {
                    'success': True,
                    'guide': result['content'],
                    'timestamp': datetime.now().isoformat(),
                    'assistant_type': 'learning_guide',
                    'topic': topic,
                    'user_level': user_level
                }
            else:
                self.logger.error(f"LLM服务调用失败: {result['error']}")
                return {
                    'success': False,
                    'error': result['error']
                }
                
        except Exception as e:
            self.logger.error(f"学习指导生成失败: {str(e)}")
            return {
                'success': False,
                'error': f"学习指导生成失败: {str(e)}"
            }
    
    def debug_help(self, error_message: str, code: str = '', language: str = 'python') -> Dict:
        """调试帮助"""
        try:
            prompt = f"""{self.assistant_role}

请帮助分析以下错误并提供解决方案：

错误信息：{error_message}

代码：
```{language}
{code}
```

请提供：
1. 错误原因分析
2. 解决方案
3. 预防措施
4. 相关知识点
5. 调试技巧

请用中文回答："""
            
            messages = [{'role': 'user', 'content': prompt}]
            result = self.llm_service.call_llm(messages)
            
            if result['success']:
                return {
                    'success': True,
                    'debug_help': result['content'],
                    'timestamp': datetime.now().isoformat(),
                    'assistant_type': 'debug_help',
                    'error_message': error_message,
                    'language': language
                }
            else:
                return {
                    'success': False,
                    'error': result['error']
                }
                
        except Exception as e:
            self.logger.error(f"调试帮助生成失败: {str(e)}")
            return {
                'success': False,
                'error': str(e)
            }
    
    def practice_suggestions(self, user_level: str = 'beginner', 
                           interests: List[str] = None) -> Dict:
        """练习建议"""
        try:
            interests_str = ', '.join(interests) if interests else '通用编程'
            
            prompt = f"""{self.assistant_role}

请为以下用户提供编程练习建议：

用户水平：{user_level}
兴趣领域：{interests_str}

请提供：
1. 适合的练习项目
2. 练习难度分级
3. 练习目标
4. 时间安排建议
5. 评估标准
6. 进阶路径
7. 推荐工具和资源

请用中文回答："""
            
            messages = [{'role': 'user', 'content': prompt}]
            result = self.llm_service.call_llm(messages)
            
            if result['success']:
                return {
                    'success': True,
                    'suggestions': result['content'],
                    'timestamp': datetime.now().isoformat(),
                    'assistant_type': 'practice_suggestions',
                    'user_level': user_level,
                    'interests': interests
                }
            else:
                return {
                    'success': False,
                    'error': result['error']
                }
                
        except Exception as e:
            self.logger.error(f"练习建议生成失败: {str(e)}")
            return {
                'success': False,
                'error': str(e)
            }
    
    def _build_context(self, user_context: Dict) -> str:
        """构建用户上下文"""
        context_parts = []
        
        if user_context.get('user_level'):
            context_parts.append(f"用户编程水平：{user_context['user_level']}")
        
        if user_context.get('role'):
            context_parts.append(f"用户角色：{user_context['role']}")
        
        if user_context.get('username'):
            context_parts.append(f"用户名：{user_context['username']}")
        
        if context_parts:
            return f"用户信息：{', '.join(context_parts)}"
        
        return "用户信息：未提供"
    
    def get_assistant_info(self) -> Dict:
        """获取助手信息"""
        return {
            'name': '编程学习助手',
            'version': '1.0.0',
            'capabilities': [
                '智能对话',
                '代码审查',
                '学习指导',
                '调试帮助',
                '概念解释',
                '练习建议'
            ],
            'supported_languages': ['python', 'java', 'cpp', 'javascript'],
            'supported_levels': ['beginner', 'intermediate', 'advanced']
        }
